<template>
    <van-form @submit="submitForm" @failed="onFailed" ref="ruleFormRef" :model="form">
    <van-cell-group> <van-field
    v-model="form.username"
    label="账号："
    placeholder="请输入账号" 
    clearable
    name="username"
    :rules="usernameRules" >
    </van-field>
    </van-cell-group> <van-cell-group>
    <van-field
    v-model="form.password" 
    label="密码："
    placeholder="请输入密码"
    clearable
    type="password" 
    name="password"
    :rules="passwordRules"
    ></van-field>
    </van-cell-group> 
    <van-cell-group>
    <van-field
    v-model="form.confirmPassword" 
    label="确认密码："
    placeholder="请再次输入密码" 
    clearable
    type="password"
    name="confirmPassword"
    :rules="comfirmPasswordRules" ></van-field>
</van-cell-group> 
<van-cell-group>
<van-button block round type="primary" native-type="submit">注册</van-button>
</van-cell-group> 
</van-form>
<div class="tip">注册成功后的用户可用于登录</div> 
</template>

<script setup>
import { ref, reactive } from 'vue'
import { getUser, register } from '../api' 
import useToken from '../stores/token'
import useUser from '../stores/user'
import { useRouter } from 'vue-router'

const { updateToken} = useToken() 
const { updateUser } = useUser()

const form = reactive({ 
    username: '',   
    password: '',
    confirmPassword: '' 
})
const ruleFormRef = ref()  
const router = useRouter()

// 定义验证规则
const usernameRules = ref([
{ required: true, message: '用户名不能为空', trigger: 'onBlur' },
{ pattern: /^\w{3,16}$/, message: '用户名长度为 3-16 个字符', trigger: 'onBlur' } ])
const passwordRules = ref([
{ required: true, message: '密码不能为空', trigger: 'onBlur' },
{ pattern: /^\w{6,24}$/, message: '密码必须为 6-24 位英文字母或数字', trigger: 'onBlur' } ])
const comfirmPasswordRules = ref([
{ required: true, message: '密码不能为空', trigger: 'onBlur' },
{ pattern: /^\w{6,24}$/, message: '密码必须为 6-24 位英文字母或数字', 
trigger: 'onBlur' },
{ validator: value => {
if (value !== form.password) { return '两次输入的密码不一致'
}
return true 
}
}
 ])

// 表单提交函数
const submitForm = async () => {
const data = await register(form)
if (data) {
updateToken(data.token)
const user = await getUser()
updateUser({
isLogin: true,
username: user.username,
avatar: user.avatar !== '' ? config.baseURL + '/' + user.avatar : '' })
router.push({ name: 'user' }) }
}
const onFailed = errorInfo => {
console.log('failed', errorInfo)
}
</script>

<style lang="less" scoped>
button {
position: fixed;
top: 270px; }
.tip {
position: fixed; top: 330px;
text-align: center; width: 100%;
font-size: 14px; color: #666;
}
</style>